package com.elephant.core.threads.atomic;

/**
 * volatile是Java提供的一种轻量级的同步机制，在并发编程中，它也扮演着比较重要的角色。
 * 同synchronized相比（synchronized通常称为重量级锁），volatile更轻量级，相比使用synchronized所带来的庞大开销，倘若能恰当的合理的使用volatile，自然是美事一桩。
 *
 * 简单总结下，volatile是一种轻量级的同步机制，它主要有两个特性：
 * 一是保证共享变量对所有线程的可见性；
 * 二是禁止指令重排序优化。
 * 同时需要注意的是，volatile对于单个的共享变量的读/写具有原子性，但是像num++这种复合操作，volatile无法保证其原子性，当然文中也提出了解决方案，就是使用并发包中的原子操作类，通过循环CAS地方式来保证num++操作的原子性。
 * @author hai
 * @description
 * @date 10:46 2018/9/7
 */
public class VolatileTest implements Runnable{

    private  int var;

    public void doSomething(){
        var = var + 1;
        System.out.println(var);
    }

    @Override
    public void run() {
        for (int i = 0; i < 100 ; i++) {
            doSomething();
        }
    }


    public static void main(String[] args) {

        VolatileTest volatileTest = new VolatileTest();

        Thread t1 = new Thread(volatileTest);
        Thread t2 = new Thread(volatileTest);

        t1.start();
        t2.start();

    }
}
